/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package protegido.util;

import fonol.entidades.Beneficiarios;
import fonol.entidades.Candidatos;
import fonol.entidades.Delegados;
import fonol.entidades.Estados;
import fonol.entidades.EstatusCandidato;
import fonol.entidades.Proyectos;
import fonol.entidades.TipoDefinido;
import fonol.entidades.TipoUsuario;
import fonol.entidades.Usuarios;
import fonol.facades.BeneficiariosFacadeRemote;
import fonol.facades.CandidatosFacadeRemote;
import fonol.facades.DelegadosFacadeRemote;
import fonol.facades.EstadosFacadeRemote;
import fonol.facades.ProyectosFacadeRemote;
import fonol.facades.UsuariosFacadeRemote;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.naming.InitialContext;
import javax.naming.NamingException;

/**
 *
 * @author fredfred2
 */
public class ProtegidoUtil {

    public boolean actualizaDelegado(Delegados delegado) {
        return getDelegadoFacade().actualiza(delegado);
    }

    public Proyectos actualizaProyecto(Proyectos proyecto) {
        return getProyectosFacade().modificar(proyecto);
    }

    public void actualizaUsuario(Usuarios usuario) {
        getUsuarioFacade().edit(usuario);
    }

    public void agregaProyecto(Proyectos proyecto) {
        getProyectosFacade().create(proyecto);
    }

    public Beneficiarios calificaProyecto(Integer id, String estatuse, String comentario) {
        Proyectos pro=getProyectosFacade().find(id);
        logea("ProtegidoUtil.calificaProyecto.proyecto:"+pro);
        if(estatuse.equals("ESPERA"))
            pro.setEstatus(EstatusCandidato.ESPERA);
        else if(estatuse.equals("RECHAZADO"))
            pro.setEstatus(EstatusCandidato.RECHAZADO);
        else if(estatuse.equals("ACEPTADO")){
            pro.setEstatus(EstatusCandidato.ACEPTADO);
        }
        pro.setComentario(comentario);
        getProyectosFacade().edit(pro);
        Beneficiarios ben=pro.getIdbeneficiario();
        logea("ProtegidoUtil.calificaProyecto.beneficiarios:"+ben);
        return ben;
    }

    public void daAltaDelegado(Delegados delegado, Usuarios usuario) {
        usuario.setIndefinido(TipoDefinido.INDEFINIDO);
        usuario.setTipo(TipoUsuario.DELEGADO);
        delegado.setIdusuario(usuario);
        getDelegadoFacade().create(delegado);
    }

    public Delegados getDelegadoPorId(Integer iddelegado) {
        return getDelegadoFacade().find(iddelegado);
    }

    public Estados getEstadoPorId(Integer estadose) {
        return getEstadosFacade().find(estadose);
    }

    public List<Estados> getEstados() {
        return getEstadosFacade().findAll();
    }

    public List<Estados> getEstadosNoUsados() {
        return getEstadosFacade().regresaEstadosNoUsados();
    }

    public Double getPresupuestoGastado(Estados estado) {
        return getProyectosFacade().regresaPresupuestoUtilizado(estado);
    }

    public List<Proyectos> getProyectosPorBeneficiario(Beneficiarios beneficiario) {
        return getProyectosFacade().getProyectosPorBeneficiario(beneficiario);
    }

    public boolean hayFondos(Proyectos pro,Delegados del) {
        return getProyectosFacade().verificaFondos(pro,del);
    }

    public Beneficiarios regresaBeneficiario(Integer idbeneficiario) {
       return getBeneficiarioFacade().find(idbeneficiario);
    }

    public List<Delegados> regresaDelegados() {
        return getDelegadoFacade().findAll();
    }

    public Proyectos regresaProyecto(Integer idproyecto) {
        return getProyectosFacade().find(idproyecto);
    }

    public boolean verificaDisponibilidad(String login) {
        return getUsuarioFacade().verificaDisponibilidad(login);
    }

    public boolean verificaPresupuestoAntes(Delegados delegado) {
        return getDelegadoFacade().verificaPresupuestoAntesAsignar(delegado);
    }

    private void logea(String m){
        Logger log=Logger.getLogger(ProtegidoUtil.class.getName());
        log.info("ProtegidoUtil: "+m);
    }
    
    public void calificaCandidato(Integer idcandidato, String estatuse,String login,String password) {
        logea("calificaCandidato");
        Candidatos c=getCandidatosFacade().find(idcandidato);
        logea(""+c);
        if(estatuse.equals("ESPERA"))
            c.setEstatus(EstatusCandidato.ESPERA);
        else if(estatuse.equals("RECHAZADO"))
            c.setEstatus(EstatusCandidato.RECHAZADO);
        else if(estatuse.equals("ACEPTADO")){
            c.setEstatus(EstatusCandidato.ACEPTADO);
            getCandidatosFacade().edit(c);
            getUsuarioFacade().generaUsuarioBeneficiario(c,login,password);
        }
        getCandidatosFacade().edit(c);
        
    }

    public Usuarios validaUsuario(String login, String pass) {
        return getUsuarioFacade().login(login, pass);
    }
    
    public CandidatosFacadeRemote getCandidatosFacade() {
        InitialContext ctx;
        CandidatosFacadeRemote ef = null;
        try {
            ctx = new InitialContext();
            ef = (CandidatosFacadeRemote) ctx.lookup(CandidatosFacadeRemote.class.getName());
        } catch (NamingException ex) {
            Logger.getLogger(ProtegidoUtil.class.getName()).log(Level.SEVERE, null, ex);
        }
        return ef;
    }

    public ProyectosFacadeRemote getProyectosFacade() {
        InitialContext ctx;
        ProyectosFacadeRemote ef = null;
        try {
            ctx = new InitialContext();
            ef = (ProyectosFacadeRemote) ctx.lookup(ProyectosFacadeRemote.class.getName());
        } catch (NamingException ex) {
            Logger.getLogger(ProtegidoUtil.class.getName()).log(Level.SEVERE, null, ex);
        }
        return ef;
    }
    
    public EstadosFacadeRemote getEstadosFacade() {
        InitialContext ctx;
        EstadosFacadeRemote ef = null;
        try {
            ctx = new InitialContext();
            ef = (EstadosFacadeRemote) ctx.lookup(EstadosFacadeRemote.class.getName());
        } catch (NamingException ex) {
            Logger.getLogger(ProtegidoUtil.class.getName()).log(Level.SEVERE, null, ex);
        }
        return ef;
    }
    
    private BeneficiariosFacadeRemote getBeneficiarioFacade() {
        InitialContext ctx;
        BeneficiariosFacadeRemote ef = null;
        try {
            ctx = new InitialContext();
            ef = (BeneficiariosFacadeRemote) ctx.lookup(BeneficiariosFacadeRemote.class.getName());
        } catch (NamingException ex) {
            Logger.getLogger(ProtegidoUtil.class.getName()).log(Level.SEVERE, null, ex);
        }
        return ef;
    }
    
    private DelegadosFacadeRemote getDelegadoFacade() {
        InitialContext ctx;
        DelegadosFacadeRemote ef = null;
        try {
            ctx = new InitialContext();
            ef = (DelegadosFacadeRemote) ctx.lookup(DelegadosFacadeRemote.class.getName());
        } catch (NamingException ex) {
            Logger.getLogger(ProtegidoUtil.class.getName()).log(Level.SEVERE, null, ex);
        }
        return ef;
    }
    
    public UsuariosFacadeRemote getUsuarioFacade() {
        InitialContext ctx;
        UsuariosFacadeRemote ef = null;
        try {
            ctx = new InitialContext();
            ef = (UsuariosFacadeRemote) ctx.lookup(UsuariosFacadeRemote.class.getName());
        } catch (NamingException ex) {
            Logger.getLogger(ProtegidoUtil.class.getName()).log(Level.SEVERE, null, ex);
        }
        return ef;
    }
    public Object getObjeto(Usuarios usuarios) {
        TipoUsuario tipo=usuarios.getTipo();
        switch(tipo){
            case GOBIERNO:
                return getUsuarioFacade().dameGobierno(usuarios);
            case BENEFICIARIO:
                return getUsuarioFacade().dameBeneficiario(usuarios);
            case DELEGADO:
                return getUsuarioFacade().dameDelegado(usuarios);
        }
        return null;
    }
    
}
